const http = require("http");
const { Server } = require("socket.io");
// const {createServer} = require('http')

const app = http.createServer();
const IO = new Server(app, {
  path: "/mysocket",
});
// 定义关键字数据
const keyWords = [
  {
    keys: ["在吗", "你好", "hi", "您好"],
    message: "尊敬的客户您好，您有什么问题要咨询？",
  },
  {
    keys: ["位置", "地址", "那里"],
    message: "您好，房源的位置可以通过地图查看",
  },
];

// 聊天室对象
const chatRoom = {};
// 监听链接服务端成功事件
IO.on("connection", (socket) => {
  console.log("链接服务端成功", socket.id);
  console.log(socket.handshake.query); // {id: 'bin'}
  const userId = socket.handshake.query.id;
  // userId = 'zjx'
  if (userId) {
    chatRoom[userId] = socket.id;
    // {zjx: '123123'}
  }
  // socket.emit('receiveMsg', {
  //     message: '欢迎来到聊天室',
  //     fromId: 'server',
  //     toId: userId
  // })

  // 注册信号，看见了sendMsg我就执行后面的方法
  socket.on("sendMsg", (info) => {
    console.log("接受到客户端发送过来的消息了", info);
    const toId = info.toId;
    const toSocketId = chatRoom[toId];
    socket.to(toSocketId).emit("receiveMsg", info);
    // 自动回复
    // 1. 服务端接收到消息的时候需要解析用户发的信息内容
    const message = info.message;
    if (typeof message === "string") {
      // 2.判断是否命中了某些关键字
      // - 需要先定义关键字以及命中关键字之后要回复的内容：代码在9-13行
      keyWords.forEach((item) => {
        if (item.keys.some((key) => message.indexOf(key) >= 0)) {
          // 3.如果命中了，就回复对应的内容item.message
          const messageObj = {
            message: item.message,
            toId: info.fromId,
            fromId: info.toId,
          };
          socket.emit("receiveMsg", messageObj);
          socket.to(toSocketId).emit("receiveMsg", messageObj);
        }
      });
    }
  });

  // 心跳检测：每隔一段时间，客户端会向服务端发送一个没有实际意义的心跳检测信号
  socket.on("ping", () => {
    socket.emit("pang");
  });
});

app.listen(3000, () => {
  console.log("服务启动成功");
});